package com.js.data.common.utils;

import org.springframework.beans.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class ListUtil {

    /**
     * 拷贝list 内的数据，一般用在 返回结果
     *
     * @param sourceList src
     * @param targetObj  tar
     * @return list
     */
    public static <T, F> List<F> copyListToList(List<T> sourceList, Class<F> targetObj) {
        List<F> targetList = new ArrayList<>();
        if ((!Objects.isNull(sourceList))) {
            sourceList.forEach(item -> {
                try {
                    F data = targetObj.getDeclaredConstructor().newInstance();
                    BeanUtils.copyProperties(item, data);
                    targetList.add(data);
                } catch (InvocationTargetException | InstantiationException | IllegalAccessException |
                         NoSuchMethodException e) {
                    throw new RuntimeException(e);
                }
            });
        }
        return targetList;
    }

    /**
     * 将Object转换成List类型
     *
     * @param obj   Object对象
     * @param clazz 数据类型
     * @param <T>   泛型类型
     * @return 转换结果
     * @author cyd
     * @since 1.0.0
     */
    public static <T> List<T> castList(Object obj, Class<T> clazz) {
        List<T> result = new ArrayList<>();
        if (obj instanceof List<?>) {
            for (Object o : (List<?>) obj) {
                if (o == null) {
                    continue;
                }
                // 转换前的前置判断，避免clazz.cast的时候出现类转换异常
                if (o.getClass().equals(clazz)) {
                    // 将对应的元素进行类型转换
                    result.add(clazz.cast(o));
                }
            }
            return result;
        }
        return result;
    }

}
